package cn.dengta.webapp.trade.vo;

import java.math.BigDecimal;

import cn.dengta.common.model.ValueProxyImpl;
import cn.dengta.common.util.Formats;
import cn.dengta.common.web.Client;
import cn.dengta.context.model.WesKit;
import cn.dengta.webapp.base.vo.AbstractVO;
import cn.dengta.webapp.trade.entity.ProductFirstConfig;
import cn.dengta.webapp.trade.entity.RechargeProduct;
import cn.dengta.webapp.trade.model.*;
import lombok.Getter;
import lombok.Setter;
import me.codeplayer.util.*;

@Getter
@Setter
public class RechargeProductVO extends AbstractVO<RechargeProduct> {

	/** 第三方支付的内购商品代号（ID） */
	public String code;
	/** 虚拟币 */
	public Integer coin;
	/** 赠送的虚拟币 */
	public Integer freeCoin;
	/** VIP赠送的虚拟币 */
	public Integer vipFreeCoin;
	/** 总钻石（充值钻石+赠送钻石）=totalFreeCoin+coin */
	public Integer totalRechargeCoin;
	/** 赠送的总钻石=freeCoin+vipFreeCoin */
	public Integer totalFreeCoin;
	/** 价格 */
	public BigDecimal price;
	/** 币种 */
	public String currency;
	/** 可激活的 VIP天数（一般只有VIP商品才有此值） */
	public Integer vipDays;
	/** 商品标签（例如：30% off、连续包月） */
	private String tag;
	/** 人性化提示信息（例如：折合 $0.99/月 ） */
	private String tips;
	/** 客户端 */
	private Client client;
	/** 排序 */
	private Integer sort;
	/** VIP配置的JSON数据 */
	private String vipConfig;
	/** 支付业务类型：1=充值钻石；2=VIP充值；3=购买提升搭讪推荐曝光率服务；4=积分兑换 @see  PayType */
	private Integer type;
	/** 是否是首次充值 */
	public Integer firstFlag;
	/** 产品类型 */
	private ProductType productType;
	/** 内购商品 优惠枚举 */
	private RechargeDiscount rechargeDiscount;
	/** 活动赠送钻石 */
	public Integer actSendCoin;

	/** 已解析到的配置对象 */
	protected ProductFirstConfig resolvedCfg;

	/** 适用范围0=未知；1=国外；2=国内 */
	//	private Integer scope;
	/** 分包处理 */
	private Integer wesKit;
	/** 图标 */
	private String icon;

	public ProductFirstConfig getResolvedCfg() {
		if (StringUtil.notEmpty(vipConfig)) {
			resolvedCfg = JSONUtil.parseObject(vipConfig, ProductFirstConfig.class);
		}
		return resolvedCfg;
	}

	public RechargeProductVO caleCoin() {
		this.totalFreeCoin = this.freeCoin + this.vipFreeCoin;
		this.totalRechargeCoin = this.totalFreeCoin + coin;
		return this;
	}

	public Integer getRechargeDiscount() {
		return rechargeDiscount == null ? RechargeDiscount.NONE.getValue() : rechargeDiscount.getValue();
	}

	public static RechargeProductVO from(RechargeProduct source) {
		return copy(source, RechargeProductVO::new);
	}

	public String getCurrency_() {
		return X.map(Currency.of(currency), Currency::getLabel);
	}

	public String getClient() {
		return client != null ? client.getValue() : null;
	}

	public String getClient_() {
		return client != null ? client.getLabel() : null;
	}

	public Integer getProductType() {
		return X.map(productType, ProductType::getValue);
	}

	public String getProductType_() {
		return X.map(productType, ProductType::getLabel);
	}

	public String getPrice() {
		return Formats.formatNumber_D(price);
	}

	public String getType_() {
		return X.map(PayType.of(type), PayType::getLabel);
	}

	public String getWesKit_() {
		return ValueProxyImpl.label(WesKit.of(this.wesKit));
	}

}
